home *** CD-ROM | disk | FTP | other *** search
/ DS-CD ROM 2 1993 August / DS CD-ROM 2.Ausgabe (August 1993).iso / programm / ds0257 / lib.exe / RECORDIO.LIB < prev    next >
Text File  |  1992-02-22  |  14KB  |  926 lines

  1. #IF !LIB4A86
  2. #ELSE
  3. #IF !INTERN_LIB4A86_S
  4. INTERN_LIB4A86_S EQU 01
  5. JMP START
  6. #ENDIF
  7. #ENDIF
  8. RFOPENMODE DB 002H
  9. DB 03DH
  10. CREATERFILEATTR DW 0H
  11. RF_WRITETHROUGH EQU 01H
  12. RF_IGNORELRU EQU 02H
  13. RF_DONTWRITETHROUGH EQU NOT RF_WRITETHROUGH
  14. RF_DONTIGNORELRU EQU NOT RF_IGNORELRU
  15. RFILETABLEERROR EQU 08601H
  16. RFILENOTOPEN EQU 08602H
  17. RFILEALREADYOPEN EQU 08603H
  18. RFILEREADERROR EQU 08604H
  19. RFILEWRITEERROR EQU 08605H
  20. RFILERECORDERROR EQU 08606H
  21. RFILELENGTHERROR EQU 08607H
  22. RFILEDEVICEERROR EQU 08608H
  23. RFILEHEADERERROR EQU 08609H
  24. MAXRF_BUFFER EQU 250XD
  25. RF_TABLECLOSED EQU 0FFFFH
  26. RF_STRUC STRUC
  27. RF_HANDLE DW ?
  28. RF_LASTRECORD DW ?,?
  29. RF_HEADERLENGTH DW ?,?
  30. RF_RECORDLENGTH DW ?
  31. RF_FILEPOINTER DW ?,?
  32. RF_BUFFERCOUNT DW ?
  33. RF_BUFFERLENGTH DW ?
  34. RF_FLAGS DB ?
  35. RF_FILEEMPTY DB ?
  36. RF_BUFFERS DW
  37. ENDS
  38. RF_BUFFERHEADER STRUC
  39. RF_BUFFERLRU DB ?
  40. RF_BUFFERUSED DB ?
  41. RF_BUFFERPTR DW ?,?
  42. RF_BUFFERFPOINTER DW ?,?
  43. ENDS
  44. RF_BUFFERNOTUSED EQU 00H
  45. RF_BUFFERREAD EQU 01H
  46. RF_BUFFERWRITTEN EQU 02H
  47. RF_L_BP EQU [BP+00H]
  48. RF_L_AX EQU [BP+02H]
  49. RF_L_BX EQU [BP+04H]
  50. RF_L_CX EQU [BP+06H]
  51. RF_L_DX EQU [BP+08H]
  52. RF_L_DI EQU [BP+0AH]
  53. RF_L_SI EQU [BP+0CH]
  54. RF_LOKALVAR1 EQU [BP-02H]
  55. RF_LOKALVAR2 EQU [BP-04H]
  56. RF_LOKALVAR3 EQU [BP-06H]
  57. M0 DW 0
  58. INTERN_CHECKRFFILECLOSED:
  59. CMP RF_HANDLE[BX],RF_TABLECLOSED
  60. JE >L1
  61. MOV AX,RFILEALREADYOPEN
  62. JMP >L8
  63. INTERN_CHECKRFFILEOPEN:
  64. CMP RF_HANDLE[BX],RF_TABLECLOSED
  65. JE >L80
  66. L1:
  67. CLI
  68. POP CS:M0
  69. PUSH SI,DI,DX,CX,BX,AX
  70. PUSH BP
  71. MOV BP,SP
  72. SUB SP,06
  73. PUSH CS:M0
  74. STI
  75. MOV SI,BX
  76. RET
  77. L80:
  78. MOV AX,RFILENOTOPEN
  79. L8:
  80. ADD SP,2
  81. STC
  82. RET
  83. INTERN_ENDROUTINE:
  84. MOV SP,BP
  85. POP BP
  86. POP BX
  87. JC >L1
  88. MOV AX,BX
  89. JMP >L2
  90. L1:
  91. MOV BX,-1
  92. MOV RF_FILEPOINTER[SI],BX
  93. MOV RF_FILEPOINTER[SI+2],BX
  94. L2:
  95. POP BX,CX,DX,DI,SI
  96. RET
  97. RESETRECORDFILE:
  98. CALL INTERN_CHECKRFFILECLOSED
  99. MOV AX,W CS:RFOPENMODE
  100. CALL INTERN_PREPARERECORDFILE
  101. JC >L8
  102. MOV AX,04202H
  103. XOR CX,CX
  104. XOR DX,DX
  105. INT 021H
  106. JC >L8
  107. MOV CX,RF_HEADERLENGTH[SI+2]
  108. MOV BX,RF_HEADERLENGTH[SI]
  109. CMP DX,CX
  110. JB >L81
  111. JA >L1
  112. CMP AX,BX
  113. JA >L1
  114. JE >L2
  115. L81:
  116. MOV AX,RFILELENGTHERROR
  117. JMP >L8
  118. L1:
  119. PUSH AX,DX
  120. SUB AX,BX
  121. SBB DX,CX
  122. MOV BX,RF_RECORDLENGTH[SI]
  123. XOR CX,CX
  124. CALL DIVLONGINT
  125. OR BX,CX
  126. JNZ L81
  127. POP DX,AX
  128. SUB AX,RF_RECORDLENGTH[SI]
  129. SBB DX,0
  130. MOV RF_LASTRECORD[SI],AX
  131. MOV RF_LASTRECORD[SI+2],DX
  132. MOV RF_FILEEMPTY[SI],0FFH
  133. L2:
  134. XOR AX,AX
  135. XOR DX,DX
  136. CALL INTERN_SETFILEPOINTER
  137. JNC >L9
  138. L8:
  139. MOV BX,RF_TABLECLOSED
  140. XCHG BX,RF_HANDLE[SI]
  141. CMP BX,RF_TABLECLOSED
  142. JE >L82
  143. PUSH AX
  144. MOV AH,03EH
  145. INT 021H
  146. POP AX
  147. L82:
  148. STC
  149. L9:
  150. JMP INTERN_ENDROUTINE
  151. CREATERECORDFILE:
  152. MOV AH,03CH
  153. JMP >L1
  154. CREATENEWRECORDFILE:
  155. MOV AH,05BH
  156. L1:
  157. CALL INTERN_CHECKRFFILECLOSED
  158. CALL INTERN_PREPARERECORDFILE
  159. JC L8
  160. JMP INTERN_ENDROUTINE
  161. CLOSERECORDFILE:
  162. CALL INTERN_CHECKRFFILEOPEN
  163. CALL INTERN_FLUSHRECORDFILE
  164. MOV BX,RF_TABLECLOSED
  165. XCHG RF_HANDLE[SI],BX
  166. MOV AH,03EH
  167. INT 021H
  168. JMP INTERN_ENDROUTINE
  169. FLUSHRECORDFILE:
  170. CALL INTERN_CHECKRFFILEOPEN
  171. CALL INTERN_FLUSHRECORDFILE
  172. JMP INTERN_ENDROUTINE
  173. READRECORD:
  174. CALL INTERN_CHECKRFFILEOPEN
  175. CALL INTERN_TESTRECORD
  176. JC >L10
  177. JNZ >L1
  178. L10:
  179. MOV AX,RFILERECORDERROR
  180. STC
  181. JMP >L9
  182. L1:
  183. CALL INTERN_GETBUFFER
  184. JNC >L2
  185. TEST RF_BUFFERUSED[DI],RF_BUFFERWRITTEN
  186. JZ >L1
  187. CALL INTERN_WRITERECORDBUFFER
  188. JC >L9
  189. L1:
  190. MOV RF_BUFFERFPOINTER[DI],AX
  191. MOV RF_BUFFERFPOINTER[DI+2],DX
  192. CALL INTERN_READRECORDBUFFER
  193. JC >L9
  194. MOV AX,RF_BUFFERPTR[DI]
  195. MOV DX,RF_BUFFERPTR[DI+2]
  196. L2:
  197. OR RF_BUFFERUSED[DI],RF_BUFFERREAD
  198. PUSH ES,DS,DI,SI
  199. MOV CX,RF_RECORDLENGTH[SI]
  200. MOV DI,RF_L_DI
  201. MOV SI,AX
  202. MOV DS,DX
  203. CLD
  204. SHR CX,1
  205. IF C MOVSB
  206. REP MOVSW
  207. POP SI,DI,DS,ES
  208. CLC
  209. L9:
  210. JMP INTERN_ENDROUTINE
  211. TESTRECORD:
  212. CALL INTERN_CHECKRFFILEOPEN
  213. CALL INTERN_TESTRECORD
  214. JMP INTERN_ENDROUTINE
  215. WRITERECORD:
  216. CALL INTERN_CHECKRFFILEOPEN
  217. MOV BX,RF_LASTRECORD[SI]
  218. MOV RF_LOKALVAR2,BX
  219. MOV BX,RF_LASTRECORD[SI+2]
  220. MOV RF_LOKALVAR3,BX
  221. CALL INTERN_TESTRECORD
  222. JC >L9
  223. JNZ >L1
  224. MOV RF_LOKALVAR2,AX
  225. MOV RF_LOKALVAR3,DX
  226. L1:
  227. CALL INTERN_GETBUFFER
  228. JNC >L2
  229. TEST RF_BUFFERUSED[DI],RF_BUFFERWRITTEN
  230. JZ >L1
  231. CALL INTERN_WRITERECORDBUFFER
  232. JC >L9
  233. L1:
  234. MOV RF_BUFFERFPOINTER[DI],AX
  235. MOV RF_BUFFERFPOINTER[DI+2],DX
  236. MOV CX,RF_RECORDLENGTH[SI]
  237. CMP RF_BUFFERLENGTH[SI],CX
  238. JE >L1
  239. CALL INTERN_READRECORDBUFFER
  240. JC >L9
  241. L1:
  242. MOV AX,RF_BUFFERPTR[DI]
  243. MOV DX,RF_BUFFERPTR[DI+2]
  244. L2:
  245. L1:
  246. OR RF_BUFFERUSED[DI],RF_BUFFERWRITTEN OR RF_BUFFERREAD
  247. PUSH ES,DS,DI,SI
  248. MOV CX,RF_RECORDLENGTH[SI]
  249. MOV DS,ES
  250. MOV SI,RF_L_DI
  251. MOV ES,DX
  252. MOV DI,AX
  253. CLD
  254. SHR CX,1
  255. IF C MOVSB
  256. REP MOVSW
  257. POP SI,DI,DS,ES
  258. PUSH AX
  259. MOV AX,RF_LOKALVAR2
  260. MOV RF_LASTRECORD[SI],AX
  261. MOV AX,RF_LOKALVAR3
  262. MOV RF_LASTRECORD[SI+2],AX
  263. POP AX
  264. TEST RF_FLAGS[SI],RF_WRITETHROUGH
  265. JE >L1
  266. CALL INTERN_WRITERECORDBUFFER
  267. JC >L9
  268. AND RF_BUFFERUSED[DI],NOT RF_BUFFERWRITTEN
  269. L1:
  270. MOV RF_FILEEMPTY[SI],0FFH
  271. CLC
  272. L9:
  273. JMP INTERN_ENDROUTINE
  274. GETRECORDFILESIZE:
  275. CALL INTERN_CHECKRFFILEOPEN
  276. CMP RF_FILEEMPTY[SI],0
  277. JNE >L1
  278. MOV AX,RF_HEADERLENGTH[SI]
  279. MOV DX,RF_HEADERLENGTH[SI+2]
  280. MOV RF_L_AX,AX
  281. MOV RF_L_DX,DX
  282. XOR AX,AX
  283. XOR DX,DX
  284. JMP >L2
  285. L1:
  286. MOV AX,RF_LASTRECORD[SI]
  287. MOV DX,RF_LASTRECORD[SI+2]
  288. ADD AX,RF_RECORDLENGTH[SI]
  289. ADC DX,0
  290. MOV RF_L_AX,AX
  291. MOV RF_L_DX,DX
  292. SUB AX,RF_HEADERLENGTH[SI]
  293. SUB DX,RF_HEADERLENGTH[SI+2]
  294. MOV BX,RF_RECORDLENGTH[SI]
  295. XOR CX,CX
  296. CALL DIVLONGINT
  297. L2:
  298. MOV RF_L_CX,DX
  299. MOV RF_L_BX,AX
  300. CLC
  301. JMP INTERN_ENDROUTINE
  302. SETRECORDFILESIZE:
  303. CALL INTERN_CHECKRFFILEOPEN
  304. MOV BX,AX
  305. OR BX,DX
  306. MOV BL,0
  307. JZ >L1
  308. DEC AX
  309. SBB DX,0
  310. DEC BL
  311. L1:
  312. MOV RF_LOKALVAR3,BL
  313. CALL INTERN_GETRECORDADRESS
  314. JC >L8
  315. PUSH DX,AX
  316. CMP B RF_LOKALVAR3,0
  317. JE >L1
  318. ADD AX,RF_RECORDLENGTH[SI]
  319. ADC DX,0
  320. L1:
  321. MOV RF_LOKALVAR1,AX
  322. MOV RF_LOKALVAR2,DX
  323. CALL INTERN_SETFILEPOINTER
  324. JC >L8
  325. XOR CX,CX
  326. MOV BX,RF_HANDLE[SI]
  327. MOV AH,040H
  328. INT 021H
  329. JC >L8
  330. MOV AX,04202H
  331. MOV BX,RF_HANDLE[SI]
  332. XOR DX,DX
  333. XOR CX,CX
  334. INT 021H
  335. JC >L8
  336. CMP AX,RF_LOKALVAR1
  337. JNE >L1
  338. CMP DX,RF_LOKALVAR2
  339. JE >L2
  340. L1:
  341. MOV AX,RFILERECORDERROR
  342. STC
  343. JMP >L8
  344. L2:
  345. POP AX,DX
  346. MOV RF_LASTRECORD[SI],AX
  347. MOV RF_LASTRECORD[SI+2],DX
  348. MOV AL,B RF_LOKALVAR3
  349. MOV RF_FILEEMPTY[SI],AL
  350. CALL INTERN_FLUSHRECORDFILE
  351. L8:
  352. JMP INTERN_ENDROUTINE
  353. READRECORDFILEHEADER:
  354. MOV AL,03FH
  355. JMP >L1
  356. WRITERECORDFILEHEADER:
  357. MOV AL,040H
  358. L1:
  359. CALL INTERN_CHECKRFFILEOPEN
  360. MOV B RF_LOKALVAR1,AL
  361. MOV AX,RF_HEADERLENGTH[SI]
  362. MOV DX,RF_HEADERLENGTH[SI+2]
  363. OR DX,DX
  364. JNZ >L0
  365. OR AX,DX
  366. JNZ >L1
  367. L0:
  368. MOV AX,RFILEHEADERERROR
  369. JMP >L8
  370. L1:
  371. MOV BX,RF_HANDLE[SI]
  372. XOR AX,AX
  373. XOR DX,DX
  374. CALL INTERN_SETFILEPOINTER
  375. JC >L8
  376. MOV CX,RF_HEADERLENGTH[SI]
  377. ADD RF_FILEPOINTER[SI],CX
  378. ADC RF_FILEPOINTER[SI+2],0
  379. PUSH DS,DX
  380. MOV DS,ES
  381. MOV DX,DI
  382. MOV AH,RF_LOKALVAR1
  383. INT 021H
  384. POP DX,DS
  385. JC >L8
  386. CMP AX,CX
  387. JE >L9
  388. MOV AL,RF_LOKALVAR1
  389. CMP AL,03FH
  390. MOV AX,RFILEREADERROR
  391. JE >L8
  392. MOV AX,RFILEWRITEERROR
  393. L8:
  394. STC
  395. L9:
  396. JMP INTERN_ENDROUTINE
  397. #IF !INTERN_CHANGESIGN
  398. INTERN_CHANGESIGN MACRO
  399. NOT #1
  400. NOT #2
  401. ADD #2,01
  402. ADC #1,0
  403. #EM
  404. #ENDIF
  405. #IF !INTERN_MULLONGINT_S
  406. INTERN_MULLONGINT_S EQU 01
  407. MULLONGINT:
  408. PUSH DI
  409. PUSH SI
  410. PUSH BP
  411. MOV BP,SP
  412. XOR SI,SI
  413. OR CX,CX
  414. JNS >L1
  415. INTERN_CHANGESIGN CX,BX
  416. INC SI
  417. L1:
  418. OR DX,DX
  419. JNS >L1
  420. INTERN_CHANGESIGN DX,AX
  421. INC SI
  422. L1:
  423. PUSH SI
  424. XOR DI,DI
  425. XOR SI,SI
  426. PUSH AX
  427. PUSH DX
  428. ADD AX,DX
  429. MUL CX
  430. MOV DI,AX
  431. POP AX
  432. MUL BX
  433. ADD DI,AX
  434. POP AX
  435. MUL BX
  436. ADD DX,DI
  437. ADD AX,SI
  438. L90:
  439. POP SI
  440. DEC SI
  441. JNZ >L9
  442. INTERN_CHANGESIGN DX,AX
  443. L9:
  444. MOV SP,BP
  445. POP BP
  446. POP SI
  447. POP DI
  448. RET
  449. #ENDIF
  450. #IF !INTERN_DIVLONGINT_S
  451. INTERN_DIVLONGINT_S EQU 01
  452. DIVLONGINT:
  453. PUSH SI,DI,BP
  454. PUSH BX
  455. OR BX,CX
  456. POP BX
  457. STC
  458. JZ >L9
  459. XOR SI,SI
  460. OR DX,DX
  461. JNS >L1
  462. INTERN_CHANGESIGN DX,AX
  463. INC SI
  464. L1:
  465. OR CX,CX
  466. JNS >L1
  467. INTERN_CHANGESIGN CX,BX
  468. INC SI
  469. INC SI
  470. L1:
  471. PUSH SI
  472. MOV DI,BX
  473. MOV SI,CX
  474. XOR BX,BX
  475. XOR CX,CX
  476. MOV BP,0021H
  477. L0:
  478. RCL BX,1
  479. RCL CX,1
  480. SUB BX,DI
  481. SBB CX,SI
  482. JNB >L1
  483. ADD BX,DI
  484. ADC CX,SI
  485. L1:
  486. CMC
  487. RCL AX,1
  488. RCL DX,1
  489. DEC BP
  490. JNZ L0
  491. POP SI
  492. OR SI,SI
  493. JE >L90
  494. CMP SI,3
  495. JNE >L1
  496. L0:
  497. INTERN_CHANGESIGN CX,BX
  498. JMP >L90
  499. L1:
  500. INTERN_CHANGESIGN DX,AX
  501. CMP SI,1
  502. JE L0
  503. L90:
  504. CLC
  505. L9:
  506. POP BP,DI,SI
  507. RET
  508. #ENDIF
  509. #IF !INTERN_MAKE32BITADRESS_S
  510. INTERN_MAKE32BITADRESS_S EQU 01
  511. MAKE32BITADRESS:
  512. PUSH CX
  513. MOV CL,0CH
  514. SHL DX,CL
  515. PUSH AX
  516. MOV CL,04H
  517. SHR AX,CL
  518. ADD DX,AX
  519. POP AX
  520. AND AX,0FH
  521. POP CX
  522. RET
  523. #ENDIF
  524. #IF !INTERN_MAKE20BITVALUE_S
  525. INTERN_MAKE20BITVALUE_S EQU 01
  526. MAKE20BITVALUE:
  527. PUSH CX
  528. MOV CL,04
  529. PUSH DX
  530. SHL DX,CL
  531. ADD AX,DX
  532. POP DX
  533. PUSHF
  534. MOV CL,12XD
  535. SHR DX,CL
  536. POPF
  537. ADC DX,0
  538. POP CX
  539. RET
  540. #ENDIF
  541. INTERN_GETREALBUFFERSIZE:
  542. PUSH DI
  543. PUSH BX,AX,DX
  544. MOV BX,RF_LASTRECORD[SI]
  545. MOV CX,RF_LASTRECORD[SI+2]
  546. CMP RF_FILEEMPTY[SI],0
  547. JE >L1
  548. ADD BX,RF_RECORDLENGTH[SI]
  549. ADC CX,0
  550. L1:
  551. CMP DX,CX
  552. JA >L1
  553. JB >L2
  554. CMP AX,BX
  555. JBE >L2
  556. L1:
  557. XOR CX,CX
  558. PUSH CX
  559. JMP >L9
  560. L2:
  561. MOV DI,RF_BUFFERLENGTH[SI]
  562. PUSH DI
  563. ADD AX,DI
  564. ADC DX,0
  565. CMP DX,CX
  566. JA >L1
  567. JB >L9
  568. CMP AX,BX
  569. JBE >L9
  570. L1:
  571. SUB AX,BX
  572. SBB DX,CX
  573. NEG AX
  574. POP CX
  575. ADD AX,CX
  576. PUSH AX
  577. L9:
  578. POP CX
  579. POP DX,AX,BX
  580. POP DI
  581. RET
  582. INTERN_FLUSHRECORDFILE:
  583. MOV CX,RF_BUFFERCOUNT[SI]
  584. LEA DI,RF_BUFFERS[SI]
  585. L00:
  586. TEST RF_BUFFERUSED[DI],RF_BUFFERWRITTEN
  587. JZ >L1
  588. PUSH CX
  589. CALL INTERN_WRITERECORDBUFFER
  590. POP CX
  591. JC >L8
  592. AND RF_BUFFERUSED[DI],NOT RF_BUFFERWRITTEN
  593. L1:
  594. ADD DI,TYPE RF_BUFFERHEADER
  595. LOOP L00
  596. PUSH CX,BX
  597. MOV AH,030H
  598. INT 021H
  599. XCHG AH,AL
  600. CMP AX,031EH
  601. CMC
  602. JNC >L1
  603. MOV BX,RF_HANDLE[SI]
  604. MOV AH,068H
  605. INT 021H
  606. L1:
  607. POP CX,BX
  608. L8:
  609. RET
  610. INTERN_TESTRECORD:
  611. PUSH CX
  612. CALL INTERN_GETRECORDADRESS
  613. JC >L8
  614. XOR CX,CX
  615. CMP RF_FILEEMPTY[SI],CL
  616. JE >L2
  617. CMP RF_LASTRECORD[SI+2],DX
  618. JB >L2
  619. JA >L1
  620. CMP RF_LASTRECORD[SI],AX
  621. JB >L2
  622. L1:
  623. DEC CX
  624. L2:
  625. OR CX,CX
  626. CLC
  627. L8:
  628. POP CX
  629. RET
  630. INTERN_SETFILEPOINTER:
  631. MOV BX,RF_HANDLE[SI]
  632. CMP AX,RF_FILEPOINTER[SI]
  633. JNE >L1
  634. CMP AX,RF_FILEPOINTER[SI+2]
  635. JNE >L1
  636. RET
  637. L1:
  638. PUSH DX,CX
  639. MOV CX,DX
  640. MOV DX,AX
  641. MOV AX,04200H
  642. INT 021H
  643. POP CX,DX
  644. JC RET
  645. MOV RF_FILEPOINTER[SI],AX
  646. MOV RF_FILEPOINTER[SI+2],DX
  647. RET
  648. INTERN_READRECORDBUFFER:
  649. MOV B RF_LOKALVAR1,03FH
  650. JMP >L1
  651. INTERN_WRITERECORDBUFFER:
  652. MOV B RF_LOKALVAR1,040H
  653. L1:
  654. PUSH DX,CX,BX,AX
  655. MOV AX,RF_BUFFERFPOINTER[DI]
  656. MOV DX,RF_BUFFERFPOINTER[DI+2]
  657. CALL INTERN_GETREALBUFFERSIZE
  658. CLC
  659. JCXZ >L9
  660. CALL INTERN_SETFILEPOINTER
  661. JC >L8
  662. ADD RF_FILEPOINTER[SI],CX
  663. ADC RF_FILEPOINTER[SI+2],0
  664. MOV AX,RF_BUFFERPTR[DI]
  665. MOV DX,RF_BUFFERPTR[DI+2]
  666. PUSH DS
  667. MOV DS,DX
  668. MOV DX,AX
  669. MOV AH,B RF_LOKALVAR1
  670. INT 021H
  671. POP DS
  672. JC >L8
  673. CMP AX,CX
  674. JE >L9
  675. MOV AL,RF_LOKALVAR1
  676. CMP AL,03FH
  677. MOV AX,RFILEREADERROR
  678. JE >L8
  679. MOV AX,RFILEWRITEERROR
  680. L8:
  681. STC
  682. POP BX
  683. PUSH AX
  684. L9:
  685. POP AX,BX,CX,DX
  686. RET
  687. INTERN_PREPARERECORDFILE:
  688. MOV RF_LOKALVAR1,AX
  689. CALL INTERN_INITRF_TABLE
  690. JC >L8
  691. CALL INTERN_INITBUFFERRECORDS
  692. PUSH DS,SI
  693. MOV DS,ES
  694. MOV SI,RF_L_DI
  695. CALL INTERN_MAKEASCIIZ
  696. PUSH AX
  697. MOV AX,RF_LOKALVAR1
  698. MOV CX,CS:CREATERFILEATTR
  699. AND CX,027H
  700. INT 021H
  701. POP DX
  702. MOV B[SI],DH
  703. POP SI,DS
  704. JC >L8
  705. MOV BX,AX
  706. MOV RF_HANDLE[SI],BX
  707. MOV AX,04400H
  708. INT 021H
  709. JC >L8
  710. TEST DL,080H
  711. JZ >L8
  712. MOV AX,RFILEDEVICEERROR
  713. STC
  714. L8:
  715. RET
  716. INTERN_INITRF_TABLE:
  717. XOR AX,AX
  718. MOV RF_FILEEMPTY[SI],AL
  719. DEC AX
  720. MOV RF_FILEPOINTER[SI],AX
  721. MOV RF_FILEPOINTER[SI+2],AX
  722. MOV AX,RF_HEADERLENGTH[SI]
  723. MOV DX,RF_HEADERLENGTH[SI+2]
  724. OR DX,DX
  725. JS >L8
  726. MOV RF_LASTRECORD[SI],AX
  727. MOV RF_LASTRECORD[SI+2],DX
  728. MOV BX,RF_RECORDLENGTH[SI]
  729. CMP BX,2
  730. JB >L8
  731. MOV AX,RF_BUFFERCOUNT[SI]
  732. CMP AX,MAXRF_BUFFER
  733. JA >L8
  734. CMP AX,1
  735. JB >L8
  736. MOV AX,RF_BUFFERLENGTH[SI]
  737. OR AX,AX
  738. JZ >L8
  739. CMP AX,BX
  740. JB >L8
  741. XOR DX,DX
  742. XOR CX,CX
  743. PUSH BX,CX
  744. CALL DIVLONGINT
  745. POP CX,BX
  746. PUSH AX
  747. OR AX,DX
  748. POP AX
  749. JZ >L8
  750. OR DX,DX
  751. JNZ >L8
  752. CALL MULLONGINT
  753. MOV RF_BUFFERLENGTH[SI],AX
  754. CLC
  755. RET
  756. L8:
  757. MOV AX,RFILETABLEERROR
  758. STC
  759. RET
  760. INTERN_INITBUFFERRECORDS:
  761. PUSH SI
  762. MOV CX,RF_BUFFERCOUNT[SI]
  763. INC CX
  764. LEA SI,RF_BUFFERS[SI]
  765. L00:
  766. MOV RF_BUFFERLRU[SI],CL
  767. MOV RF_BUFFERUSED[SI],RF_BUFFERNOTUSED
  768. MOV AX,RF_BUFFERPTR[SI]
  769. MOV DX,RF_BUFFERPTR[SI+2]
  770. PUSH AX
  771. SHR AX,1
  772. SHR AX,1
  773. SHR AX,1
  774. SHR AX,1
  775. ADD DX,AX
  776. POP AX
  777. AND AX,0FH
  778. MOV RF_BUFFERPTR[SI],AX
  779. MOV RF_BUFFERPTR[SI+2],DX
  780. ADD SI,TYPE RF_BUFFERHEADER
  781. DEC CL
  782. CMP CL,1
  783. JNE L00
  784. POP SI
  785. RET
  786. INTERN_GETBUFFER:
  787. PUSH BP
  788. MOV DI,SI
  789. MOV CX,RF_BUFFERCOUNT[SI]
  790. LEA DI,RF_BUFFERS[SI]
  791. MOV BP,DI
  792. L00:
  793. PUSH CX
  794. CMP RF_BUFFERUSED[DI],RF_BUFFERNOTUSED
  795. JE >L02
  796. MOV BX,RF_BUFFERFPOINTER[DI]
  797. MOV CX,RF_BUFFERFPOINTER[DI+2]
  798. CMP CX,DX
  799. JA >L02
  800. JB >L01
  801. CMP BX,AX
  802. JA >L02
  803. L01:
  804. ADD BX,RF_BUFFERLENGTH[SI]
  805. ADC CX,0
  806. CMP CX,DX
  807. JB >L02
  808. JA >L01
  809. CMP BX,AX
  810. JBE >L02
  811. L01:
  812. SUB AX,RF_BUFFERFPOINTER[DI]
  813. SBB DX,RF_BUFFERFPOINTER[DI+2]
  814. PUSH CX,BX
  815. MOV CX,DX
  816. MOV BX,AX
  817. MOV AX,RF_BUFFERPTR[DI]
  818. MOV DX,RF_BUFFERPTR[DI+2]
  819. CALL MAKE20BITVALUE
  820. ADD AX,BX
  821. ADC DX,CX
  822. CALL MAKE32BITADRESS
  823. POP BX,CX
  824. TEST RF_FLAGS[SI],RF_IGNORELRU
  825. JZ >L020
  826. POP CX
  827. JMP >L9
  828. L020:
  829. MOV CX,RF_BUFFERCOUNT[SI]
  830. INC CX
  831. INC CX
  832. MOV RF_BUFFERLRU[DI],CL
  833. POP CX
  834. JMP >L03
  835. L02:
  836. MOV CL,RF_BUFFERLRU[DI]
  837. CMP CL,DS:RF_BUFFERLRU[BP]
  838. IF B MOV BP,DI
  839. ADD DI,TYPE RF_BUFFERHEADER
  840. POP CX
  841. LOOP L00
  842. MOV DI,BP
  843. TEST RF_FLAGS[SI],RF_IGNORELRU
  844. JZ >L030
  845. STC
  846. JMP >L9
  847. L030:
  848. MOV CX,RF_BUFFERCOUNT[SI]
  849. INC CX
  850. INC CX
  851. MOV RF_BUFFERLRU[DI],CL
  852. STC
  853. L03:
  854. PUSHF
  855. PUSH DI
  856. MOV CX,RF_BUFFERCOUNT[SI]
  857. MOV BX,CX
  858. INC BX
  859. LEA DI,RF_BUFFERS[SI]
  860. L03:
  861. DEC RF_BUFFERLRU[DI]
  862. ADD DI,TYPE RF_BUFFERHEADER
  863. LOOP L03
  864. POP DI
  865. POPF
  866. L9:
  867. POP BP
  868. RET
  869. INTERN_GETRECORDADRESS:
  870. MOV BX,RF_RECORDLENGTH[SI]
  871. XOR CX,CX
  872. CALL MULLONGINT
  873. OR DX,DX
  874. JS >L8
  875. ADD AX,RF_HEADERLENGTH[SI]
  876. ADC DX,RF_HEADERLENGTH[SI+2]
  877. JC >L8
  878. JS >L8
  879. CLC
  880. RET
  881. L8:
  882. MOV AX,RFILERECORDERROR
  883. STC
  884. RET
  885. #IF !INTERN_MAKEASCIIZ_S
  886. INTERN_MAKEASCIIZ_S EQU 01
  887. INTERN_MAKEASCIIZ:
  888. CLD
  889. XOR AH,AH
  890. LODSB
  891. MOV DX,SI
  892. ADD SI,AX
  893. XCHG AH,[SI]
  894. RET
  895. #ENDIF
  896. #IF !INTERN_CMARK0
  897. INTERN_CMARK0 EQU 01H
  898. INTERN_CMARK1:
  899. PUSH BP
  900. MOV BP,SP
  901. MOV BX,06H
  902. SUB CH,[BP+SI]
  903. SUB AH,[BX+SI]
  904. DEC SP
  905. DEC CX
  906. INC DX
  907. XOR AL,041H
  908. CMP B[02820H],DH
  909. INC BX
  910. SUB W[BX+SI],SP
  911. INC DX
  912. CS AND B[BP+DI+043H],DL
  913. DEC AX
  914. INC BP
  915. DEC BP
  916. DEC BP
  917. INC BP
  918. PUSH DX
  919. AND B[BP+SI],CH
  920. SUB CH,[BP+SI]
  921. POP DX
  922. MOV SP,BP
  923. POP BP
  924. RET
  925. #ENDIF
  926.